package main

import (
	"fmt"

	"sync"

	"time"
)

type MutexInfo struct {
	mutex sync.RWMutex

	infos []int
}

func (m *MutexInfo) addInfo(value int) {

	m.mutex.Lock()

	defer m.mutex.Unlock()

	fmt.Println("write start", value)

	m.infos = append(m.infos, value)

	fmt.Println("write start end", value)

}

func (m *MutexInfo) readInfo(value int) {

	m.mutex.RLock()

	defer m.mutex.RUnlock()

	fmt.Println("read start", value)

	fmt.Println("read end", value)

}

func main() {

	m := MutexInfo{}

	for i := 0; i < 10; i++ {

		go m.addInfo(i)

		go m.readInfo(i)

	}

	time.Sleep(time.Second * 3)

	fmt.Println(m.infos)

}

/*
2）读写锁实现线程同步

go语言提供了另一种更加友好的线程同步的方式：sync.RWMutex。相对于互斥锁的简单暴力，读写锁更加人性化，是经典的单写多读模式。在读锁占用的情况下，会阻止写，但不阻止读，也就是多个goroutine可同时获取读锁，而写锁会阻止其他线程的读写操作。


从结果我们可以看出，开始的时候读线程占用读锁，并且多个线程可以同时开始读操作，但是写操作只能单个进行。

*/
